package samber

import (
	"fmt"
	"github.com/samber/lo"
	"strconv"
)

// Map 按照自己的逻辑处理数组并形成新的
func Map() {
	list := []int64{1, 2, 3, 4}
	result := lo.Map(list, func(nbr int64, index int) string {
		return strconv.FormatInt(nbr*2, 10)
	})
	fmt.Printf("%v %v\n", result, list)
}

// MapEntries 操作映射项并将其转换为另一种类型的映射
func MapEntries() {
	kv := map[string]int{"foo": 1, "bar": 2}
	result := lo.MapEntries(kv, func(k string, v int) (int, string) {
		return v, k
	})
	fmt.Printf("%v \n", result) // map[1:1 2:2 3:3 4:4]
}

// MapKeys 操作映射键并将其转换为另一种类型的映射
func MapKeys() {
	kv := map[int]int{1: 1, 2: 2, 3: 3, 4: 4}
	result := lo.MapKeys(kv, func(_ int, v int) string {
		return strconv.FormatInt(int64(v), 10)
	})
	fmt.Printf("%v \n", result) // map[1:1 2:2 3:3 4:4]
}

// MapToSlice Map按照自己的逻辑转Slice
func MapToSlice() {
	kv := map[int]int64{1: 1, 2: 2, 3: 3, 4: 4}
	result := lo.MapToSlice(kv, func(k int, v int64) string {
		return fmt.Sprintf("%d_%d", k, v)
	})
	fmt.Printf("%v \n", result) // [1_1, 2_2, 3_3, 4_4]
}

// MapValues 与MapKeys一个逻辑
func MapValues() {
	kv := map[int]int{1: 1, 2: 2, 3: 3, 4: 4}

	result := lo.MapValues(kv, func(_ int, v int) string {
		return strconv.FormatInt(int64(v), 10)
	})
	fmt.Printf("%v \n", result) // map[1:1 2:2 3:3 4:4]
}

func Max() {
	list := []int64{1, 2, 3, 4}
	res := lo.Max(list)
	fmt.Printf("%v \n", res) // 4
}

func MaxBy() {
	list := []int64{1, 2, 3, 4}
	res := lo.MaxBy(list, func(value int64, max int64) bool {
		return value > max
	})
	fmt.Printf("%v \n", res) // 4
}

func Min() {
	fmt.Println("Min 与 Max一个逻辑")
}

func MinBy() {
	fmt.Println("MinBy 与 MaxBy 一个逻辑")
}

func Must() {
	// won't panic
	val := lo.Must(42, nil)
	//// will panic
	//_ = lo.Must(42, fmt.Errorf("my error"))
	fmt.Printf("%v \n", val) // 42
}
